﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_05_Gestionar_Practicas_por_Materia;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Data;

namespace vudu.Presentacion.Presentador.VU_05_Gestionar_Practicas_por_Materia
{
    public class PresentadorModificarSeccionPractica
    {
        public IContratoModificarSeccionPractica _vista;
        private EnlaceLogico _fachada;
        private Escuela _miEscuela;
        private List<Materia> _misMaterias;
        public HorarioDeClase _miHorarioSeleccionado;
        private string _rol;


        public PresentadorModificarSeccionPractica(IContratoModificarSeccionPractica vista)
        {
            _vista = vista;
            _rol = (string)_vista.Sesion["TipoRol"];
            InitSecure(_rol);
        }

        protected void InitSecure(string miRol)
        {
            //Valida el inicio de sesion
            //con el usuario correcto
            if ((miRol != null) && (miRol.Equals("Escuela")))
            {
                _fachada = (EnlaceLogico)_vista.Sesion["Fachada"];
                _miEscuela = (Escuela)_fachada.RolActual;
                _vista.LabelEscuela.Text = _miEscuela.NombreEscuela;
                _misMaterias = _fachada.ConsultarListaMateriasConPractica(_miEscuela.NombreEscuela);
                _miHorarioSeleccionado = new HorarioDeClase();
            }
            else
            { _vista.Redirect("../VU_15 Gestion de Acceso/InicioSistema.aspx"); }
        }

        public void UnLoadDdlGeneric(DropDownList myDdl)
        {
            //Reinicia las propiedades de un elemento
            //de tipo DropDownList
            ListItem myListItem = new ListItem();
            myDdl.Items.Clear();
            myListItem.Value = "0";
            myListItem.Text = "- Seleccionar -";
            myDdl.Items.Add(myListItem);
            myDdl.Visible = false;
        }

        private void HideIdPracticaColumn()
        {
            _vista.GridViewModify.HeaderRow.Cells[4].Visible = false;
            foreach (GridViewRow row in _vista.GridViewModify.Rows)
            {
                row.Cells[4].Visible = false;
            }
        }

        #region UnLoadTableHorarioComponents

            public void UnVisibleAllDdlSalon()
            {
                //Coloca la propiedad visible de los elementos de la GUI correspondientes
                //a la Row de "Salon" en false
                _vista.DdlSalonLun.Visible = false;
                _vista.DdlSalonMar.Visible = false;
                _vista.DdlSalonMie.Visible = false;
                _vista.DdlSalonJue.Visible = false;
                _vista.DdlSalonVie.Visible = false;
            }
            public void UnLoadAllDdlSalon()
            {
                //Reinicia las propiedades de cada elemento correspondiente
                //a la Row de "Salon"
                UnLoadDdlGeneric(_vista.DdlSalonLun);
                UnLoadDdlGeneric(_vista.DdlSalonMar);
                UnLoadDdlGeneric(_vista.DdlSalonMie);
                UnLoadDdlGeneric(_vista.DdlSalonJue);
                UnLoadDdlGeneric(_vista.DdlSalonVie);
                UnVisibleAllDdlSalon();
            }

            public void UnVisibleAllDdlFin()
            {
                //Coloca la propiedad visible de los elementos de la GUI correspondientes
                //a la Row de "Hora Fin" en false
                _vista.DdlFinLun.Visible = false;
                _vista.DdlFinMar.Visible = false;
                _vista.DdlFinMie.Visible = false;
                _vista.DdlFinJue.Visible = false;
                _vista.DdlFinVie.Visible = false;
            }
            public void UnLoadAllDdlFin()
            {
                //Reinicia las propiedades de cada elemento correspondiente
                //a la Row de "Hora Fin"
                UnLoadDdlGeneric(_vista.DdlFinLun);
                UnLoadDdlGeneric(_vista.DdlFinMar);
                UnLoadDdlGeneric(_vista.DdlFinMie);
                UnLoadDdlGeneric(_vista.DdlFinJue);
                UnLoadDdlGeneric(_vista.DdlFinVie);
                UnVisibleAllDdlFin();
                UnLoadAllDdlSalon();
            }

            public void UnLoadAllDdlIni()
            {
                //Reinicia las propiedades de cada elemento correspondiente
                //a la Row de "Hora Inicio"
                UnLoadDdlGeneric(_vista.DdlIniLun);
                UnLoadDdlGeneric(_vista.DdlIniMar);
                UnLoadDdlGeneric(_vista.DdlIniMie);
                UnLoadDdlGeneric(_vista.DdlIniJue);
                UnLoadDdlGeneric(_vista.DdlIniVie);
                UnLoadAllDdlFin();
            }

        #endregion EndUnLoadTableHorarioComponents
        
        #region UnLoadUpperComponents

            public void UnVisibleHorario()
            {
                //Coloca la propiedad visible de los elementos de la GUI
                //correspondientes a la Row de "Horarios" en false
                _vista.LabelOHrsSelect.Visible = false;
                _vista.LabelHrsSelect.Visible = false;
                _vista.LabelNumHrsSelect.Visible = false;
                _vista.TableHorario.Visible = false;
                _vista.LabelNumHrsSelect.Text = "0";
            }
            public void UnLoadHorario()
            {
                //Reinicia las propiedades de los elementos
                //DropDownList de "Hora Inicio"
                UnLoadAllDdlIni();
                UnVisibleHorario();
            }

            public void UnVisibleAllProfesor()
            {
                //Coloca la propiedad visible de los elementos de la GUI
                //correspondientes a la Row de "Profesor" en false
                _vista.LabelOProfesor.Visible = false;
                _vista.LabelProfesor.Visible = false;
                _vista.DdlProfesor.Visible = false;
            }
            public void UnLoadAllDdlProfesor()
            {
                //Reinicia las propiedades de los elementos
                //correpondientes al Row "Profesor" y a los
                //demas elementos que dinamicamente se alimenten
                //de el
                UnLoadDdlGeneric(_vista.DdlProfesor);
                UnLoadHorario();
                UnVisibleAllProfesor();
            }

            public void UnVisibleAllSeccTeoria()
            {
                //Coloca la propiedad visible de los elementos de la GUI
                //correspondientes a la Row de "Seccion" en false
                _vista.LabelOSeccTeoria.Visible = false;
                _vista.LabelSeccTeoria.Visible = false;
                _vista.LabelHrsReq.Visible = false;
                _vista.LabelNumHrsReq.Visible = false;
            }
            public void UnLoadAllDdlSeccTeoria()
            {
                //Reinicia las propiedades de los elementos
                //correpondientes al Row "Seccion" y a los
                //demas elementos que dinamicamente se alimenten
                //de el      
                UnLoadDdlGeneric(_vista.DdlSeccTeoria);
                _vista.GridViewModify.Visible = false;
                UnVisibleAllSeccTeoria();
            }

            public void UnLoadGridView()
            {
                DataTable myDataTable = new DataTable();
                myDataTable.Columns.Add("Nombre", typeof(string));
                myDataTable.Columns.Add("Nro. Seccion", typeof(string));
                myDataTable.Columns.Add("Profesor", typeof(string));
                myDataTable.Columns.Add("Id", typeof(string));
                _vista.GridViewModify.DataSource = myDataTable;
                _vista.GridViewModify.DataBind();
                _vista.GridViewModify.Visible = false;
            }

        #endregion endUnLoadUpperComponents

        #region VisibleUpperComponents

            protected void VisibleSeccTeoria()
            {
                //Coloca en true la propiedad visible
                //de los elementos que corresponden
                //al Row "Seccion" 
                _vista.LabelOSeccTeoria.Visible = true;
                _vista.LabelSeccTeoria.Visible = true;
                _vista.DdlSeccTeoria.Visible = true;
            }

            protected void VisibleProfesor()
            {
                //Coloca en true la propiedad visible
                //de los elementos que corresponden
                //al Row "Profesor"  
                _vista.LabelOProfesor.Visible = true;
                _vista.LabelProfesor.Visible = true;
                _vista.DdlProfesor.Visible = true;
                _vista.LabelHrsReq.Visible = true;
                _vista.LabelNumHrsReq.Visible = true;
            }

            protected void VisibleHorario()
            {
                //Coloca en true la propiedad visible
                //de los elementos que corresponden
                //al Row "Horario"  
                _vista.LabelOHrsSelect.Visible = true;
                _vista.LabelHrsSelect.Visible = true;
                _vista.LabelNumHrsSelect.Visible = true;
                _vista.TableHorario.Visible = true;
            }

        #endregion endVisibleUpperComponents

        #region SettingHoraIni

            protected void SetHoraIniDay(DropDownList myDdl)
            {
                //Llena un DropDownList con las horas de inicio
                //de clases de 7am a 8pm    
                for (int index = 7; index < (20); index++)
                {
                    ListItem myItem = new ListItem();
                    myItem.Value = index.ToString();
                    myItem.Text = index.ToString() + ":00";
                    myDdl.Items.Add(myItem);
                }
                myDdl.Visible = true;
            }

            protected void SetHoraIniWeek()
            {
                //Llena los DropDownList de cada dia
                //de la semana  
                SetHoraIniDay(_vista.DdlIniLun);
                SetHoraIniDay(_vista.DdlIniMar);
                SetHoraIniDay(_vista.DdlIniMie);
                SetHoraIniDay(_vista.DdlIniJue);
                SetHoraIniDay(_vista.DdlIniVie);
            }

        #endregion endSettingHoraIni

        #region SettingHoraFin

            public void LoadDdlHoraFin(DropDownList myDdlFin, DropDownList myDdlIni)
            {
                //Verifica las horas seleccionadas y las suma a la hora de inicio
                //seleccionada previamente, para hacer el llenado del DDL de la
                //hora final de clases, valida si el valor seleccionado en la hora
                //de inicio es correcto 
                int hrsSelect = Convert.ToInt32(myDdlIni.SelectedItem.Value);
                int hrsReq = Convert.ToInt32(_vista.LabelNumHrsReq.Text);
                if (!myDdlIni.SelectedItem.Value.Equals("0"))
                {
                    for (int index = 1; (index <= hrsReq) && ((index + hrsSelect) <= 20); index++)
                    {
                        ListItem myItem = new ListItem();
                        myItem.Value = (index + hrsSelect).ToString();
                        myItem.Text = (index + hrsSelect).ToString() + ":00";
                        myDdlFin.Items.Add(myItem);
                    }
                    myDdlFin.Visible = true;
                }
                else
                { myDdlFin.Visible = false; }
            }

            public void UnLoadDdlHoraFin(DropDownList myDdlFin, DropDownList myDdlSalon)
            {
                //Vacia los DropDownList de Hora Fin y de los que
                //dinamicamente se alimenten de el  
                UnLoadDdlGeneric(myDdlFin);
                UnLoadDdlGeneric(myDdlSalon);
                myDdlSalon.Visible = false;
            }

        #endregion endSettingHoraFin

        #region LoadingSalonesForEachHorario

            public void SetHeadersHorario(DropDownList myDdl)
            {
                //Llena el atributo Dia del objeto de tipo
                //Horario de clase, segun sea el DDL evaluado   
                if (myDdl.ID.Equals("ddlIniLun"))
                { _miHorarioSeleccionado.Dia = "Lunes"; }
                else if (myDdl.ID.Equals("ddlIniMar"))
                { _miHorarioSeleccionado.Dia = "Martes"; }
                else if (myDdl.ID.Equals("ddlIniMie"))
                { _miHorarioSeleccionado.Dia = "Miercoles"; }
                else if (myDdl.ID.Equals("ddlIniJue"))
                { _miHorarioSeleccionado.Dia = "Jueves"; }
                else if (myDdl.ID.Equals("ddlIniVie"))
                { _miHorarioSeleccionado.Dia = "Viernes"; }
            }

            public void SetHorarioForSearching(DropDownList ddlIni, DropDownList ddlFin, DropDownList ddlSalon)
            {
                //Valida que la hora fin sea correct para proceder
                //a la busqueda del salon correspondiente 
                if (!ddlFin.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(ddlFin.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(ddlIni.SelectedItem.Value), 00, 0);

                    _miHorarioSeleccionado.HoraFin = myHourFin;
                    _miHorarioSeleccionado.HoraInicio = myHourIni;

                    SetHeadersHorario(ddlIni);
                    LoadDdlSalon(ddlSalon, _miHorarioSeleccionado);
                }
                else
                {
                    UnLoadDdlGeneric(ddlSalon);
                    ddlSalon.Visible = false;
                }
            }

            protected void FillDdlSalones(DropDownList myDdl, List<Salon> misSalones)
            {
                //Se realiza el llenado del DDL de salones disponibles
                //con la lista de salones obtenida en el algoritomo de busqueda   
                for (int index = 0; index < misSalones.Count; index++)
                {
                    ListItem myListItem = new ListItem();
                    myListItem.Value = misSalones[index].NumeroSalon.ToString();
                    myListItem.Text = misSalones[index].Nombre;
                    myDdl.Items.Add(myListItem);
                }
            }

            protected void FillDdlSalonesNotfound(DropDownList ddlSalon)
            {
                //En caso de la lista estar vacia, se bloquea el DDL
                //y se notifica que no hay salones disponibles para
                //ese horario    
                ddlSalon.Items.Clear();
                ListItem myListItem = new ListItem();
                myListItem.Value = "0";
                myListItem.Enabled = false;
                myListItem.Text = "Salón No Disponible";
                ddlSalon.Items.Add(myListItem);
            }

            public void LoadDdlSalon(DropDownList ddlSalon, HorarioDeClase miHorarioSeleccionado)
            {
                //se ejecuta el algoritmo de busqueda para un horario determinado
                int idProfesor = Convert.ToInt32(_vista.DdlProfesor.SelectedItem.Value);
                List<Salon> misSalones = new List<Salon>();
                misSalones = _fachada.ListaSalonesDisponibles(miHorarioSeleccionado, _miEscuela.NombreEscuela, _miEscuela.IdEscuela, idProfesor);
                if ((misSalones != null) && (misSalones.Count > 0))
                { FillDdlSalones(ddlSalon, misSalones); }
                else
                { FillDdlSalonesNotfound(ddlSalon); }
                ddlSalon.Visible = true;
            }

        #endregion endLoadingSalonesForEachHorario

        #region SettingHrsSelected

            public void CheckHrsLun()
            {
                //se realiza el seteo del valor de la etiqueta de
                //horas seleccionadas dinamicamente los lunes  
                if (!_vista.DdlSalonLun.SelectedItem.Value.Equals("0"))
                {
                    int hrsFin = Convert.ToInt32(_vista.DdlFinLun.SelectedItem.Value);
                    int hrsIni = Convert.ToInt32(_vista.DdlIniLun.SelectedItem.Value);
                    int hrsSelect = Convert.ToInt32(_vista.LabelNumHrsSelect.Text);
                    hrsSelect = hrsSelect + (hrsFin - hrsIni);
                    _vista.LabelNumHrsSelect.Text = hrsSelect.ToString();
                }
            }

            public void CheckHrsMar()
            {
                //se realiza el seteo del valor de la etiqueta de
                //horas seleccionadas dinamicamente los martes
                if (!_vista.DdlSalonMar.SelectedItem.Value.Equals("0"))
                {
                    int hrsFin = Convert.ToInt32(_vista.DdlFinMar.SelectedItem.Value);
                    int hrsIni = Convert.ToInt32(_vista.DdlIniMar.SelectedItem.Value);
                    int hrsSelect = Convert.ToInt32(_vista.LabelNumHrsSelect.Text);
                    hrsSelect = hrsSelect + (hrsFin - hrsIni);
                    _vista.LabelNumHrsSelect.Text = hrsSelect.ToString();
                }
            }

            public void CheckHrsMie()
            {
                //se realiza el seteo del valor de la etiqueta de
                //horas seleccionadas dinamicamente los miercoles
                if (!_vista.DdlSalonMie.SelectedItem.Value.Equals("0"))
                {
                    int hrsFin = Convert.ToInt32(_vista.DdlFinMie.SelectedItem.Value);
                    int hrsIni = Convert.ToInt32(_vista.DdlIniMie.SelectedItem.Value);
                    int hrsSelect = Convert.ToInt32(_vista.LabelNumHrsSelect.Text);
                    hrsSelect = hrsSelect + (hrsFin - hrsIni);
                    _vista.LabelNumHrsSelect.Text = hrsSelect.ToString();
                }
            }

            public void CheckHrsJue()
            {
                //se realiza el seteo del valor de la etiqueta de
                //horas seleccionadas dinamicamente los jueves
                if (!_vista.DdlSalonJue.SelectedItem.Value.Equals("0"))
                {
                    int hrsFin = Convert.ToInt32(_vista.DdlFinJue.SelectedItem.Value);
                    int hrsIni = Convert.ToInt32(_vista.DdlIniJue.SelectedItem.Value);
                    int hrsSelect = Convert.ToInt32(_vista.LabelNumHrsSelect.Text);
                    hrsSelect = hrsSelect + (hrsFin - hrsIni);
                    _vista.LabelNumHrsSelect.Text = hrsSelect.ToString();
                }
            }

            public void CheckHrsVie()
            {
                //se realiza el seteo del valor de la etiqueta de
                //horas seleccionadas dinamicamente los viernes
                if (!_vista.DdlSalonVie.SelectedItem.Value.Equals("0"))
                {
                    int hrsFin = Convert.ToInt32(_vista.DdlFinVie.SelectedItem.Value);
                    int hrsIni = Convert.ToInt32(_vista.DdlIniVie.SelectedItem.Value);
                    int hrsSelect = Convert.ToInt32(_vista.LabelNumHrsSelect.Text);
                    hrsSelect = hrsSelect + (hrsFin - hrsIni);
                    _vista.LabelNumHrsSelect.Text = hrsSelect.ToString();
                }
            }

            public void SetHrsSelect()
            {
                //hace un recorrido y suma las horas seleccionadas por dia
                //para mostrarlo en la etiqueta labelHrsSelect. realiza los
                //trabajos de estandarixacion, si se cumple permite continuar
                //en caso contrario obliga al usuario a detenerse, o colocar las
                //horas correctas
                int idMateria = Convert.ToInt32(_vista.DdlMateria.SelectedItem.Value);
                _vista.LabelNumHrsSelect.Text = "0";
                CheckHrsLun();
                CheckHrsMar();
                CheckHrsMie();
                CheckHrsJue();
                CheckHrsVie();
                if (Convert.ToInt32(_vista.LabelNumHrsSelect.Text) == GetHrsReq(idMateria))
                {
                    _vista.BtnNextPractica.Visible = true;
                    _vista.BtnBackPractica.Visible = true;
                    _vista.BtnBackPracticaCenter.Visible = false;
                    _vista.LabelNumHrsSelect.ForeColor = System.Drawing.Color.Black;
                    _vista.LabelHrsSelect.ForeColor = System.Drawing.Color.Black;
                }
                else
                {
                    _vista.BtnNextPractica.Visible = false;
                    _vista.BtnBackPractica.Visible = false;
                    _vista.BtnBackPracticaCenter.Visible = true;
                    _vista.LabelNumHrsSelect.ForeColor = System.Drawing.Color.Red;
                    _vista.LabelHrsSelect.ForeColor = System.Drawing.Color.Red;
                }
            }

        #endregion SettingHrsSelected

        #region SettingFinalHrsSelected
        
            public void CheckFinalHrsLun(List<HorarioDeClase> misHorariosDef)
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                HorarioDeClase miHorarioDef = new HorarioDeClase();
                Salon miSalon = new Salon();
                if (!_vista.DdlSalonLun.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlFinLun.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlIniLun.SelectedItem.Value), 00, 0);
                    miSalon.NumeroSalon = Convert.ToInt32(_vista.DdlSalonLun.SelectedItem.Value);
                    miHorarioDef.Dia = "Lunes";
                    miHorarioDef.HoraFin = myHourFin;
                    miHorarioDef.HoraInicio = myHourIni;
                    miHorarioDef.SalonDeClase = miSalon;
                    misHorariosDef.Add(miHorarioDef);
                }
            }

            public void CheckFinalHrsMar(List<HorarioDeClase> misHorariosDef)
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                HorarioDeClase miHorarioDef = new HorarioDeClase();
                Salon miSalon = new Salon();
                if (!_vista.DdlSalonMar.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlFinMar.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlIniMar.SelectedItem.Value), 00, 0);
                    miSalon.NumeroSalon = Convert.ToInt32(_vista.DdlSalonMar.SelectedItem.Value);
                    miHorarioDef.Dia = "Martes";
                    miHorarioDef.HoraFin = myHourFin;
                    miHorarioDef.HoraInicio = myHourIni;
                    miHorarioDef.SalonDeClase = miSalon;
                    misHorariosDef.Add(miHorarioDef);
                }
            }

            public void CheckFinalHrsMie(List<HorarioDeClase> misHorariosDef)
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                HorarioDeClase miHorarioDef = new HorarioDeClase();
                Salon miSalon = new Salon();
                if (!_vista.DdlSalonMie.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlFinMie.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlIniMie.SelectedItem.Value), 00, 0);
                    miSalon.NumeroSalon = Convert.ToInt32(_vista.DdlSalonMie.SelectedItem.Value);
                    miHorarioDef.Dia = "Miercoles";
                    miHorarioDef.HoraFin = myHourFin;
                    miHorarioDef.HoraInicio = myHourIni;
                    miHorarioDef.SalonDeClase = miSalon;
                    misHorariosDef.Add(miHorarioDef);
                }
            }

            public void CheckFinalHrsJue(List<HorarioDeClase> misHorariosDef)
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                HorarioDeClase miHorarioDef = new HorarioDeClase();
                Salon miSalon = new Salon();
                if (!_vista.DdlSalonJue.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlFinJue.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlIniJue.SelectedItem.Value), 00, 0);
                    miSalon.NumeroSalon = Convert.ToInt32(_vista.DdlSalonJue.SelectedItem.Value);
                    miHorarioDef.Dia = "Jueves";
                    miHorarioDef.HoraFin = myHourFin;
                    miHorarioDef.HoraInicio = myHourIni;
                    miHorarioDef.SalonDeClase = miSalon;
                    misHorariosDef.Add(miHorarioDef);
                }
            }

            public void CheckFinalHrsVie(List<HorarioDeClase> misHorariosDef)
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                HorarioDeClase miHorarioDef = new HorarioDeClase();
                Salon miSalon = new Salon();
                if (!_vista.DdlSalonVie.SelectedItem.Value.Equals("0"))
                {
                    DateTime myHourFin = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlFinVie.SelectedItem.Value), 00, 0);
                    DateTime myHourIni = new DateTime(1900, 01, 01, Convert.ToInt32(_vista.DdlIniVie.SelectedItem.Value), 00, 0);
                    miSalon.NumeroSalon = Convert.ToInt32(_vista.DdlSalonVie.SelectedItem.Value);
                    miHorarioDef.Dia = "Viernes";
                    miHorarioDef.HoraFin = myHourFin;
                    miHorarioDef.HoraInicio = myHourIni;
                    miHorarioDef.SalonDeClase = miSalon;
                    misHorariosDef.Add(miHorarioDef);
                }
            }

            public List<HorarioDeClase> SetFinalHrsSelect()
            {
                //revisa si hay un salon seleccionado en el ddl salon
                //en caso de estar seleccionado, obtiene su horario
                //desde la interfaz y se guarda en un objeto de tipo
                //lista de horarios
                List<HorarioDeClase> misHorariosDef = new List<HorarioDeClase>();
                CheckFinalHrsLun(misHorariosDef);
                CheckFinalHrsMar(misHorariosDef);
                CheckFinalHrsMie(misHorariosDef);
                CheckFinalHrsJue(misHorariosDef);
                CheckFinalHrsVie(misHorariosDef);
                return misHorariosDef;
            }

        #endregion endSettingFinalHrsSelected


        protected int GetHrsReq(int idMateriaSelect)
        {
            //obtiene las horas establecidas para una materia
            int hrsReq = 0;
            bool bandera = false;
            for (int index = 0; (index < _misMaterias.Count) && (!bandera); index++)
            {
                if (_misMaterias[index].Codigo == idMateriaSelect)
                {
                    hrsReq = _misMaterias[index].HorasPractica;
                    bandera = true;
                }
            }
            return hrsReq;
        }

        #region Loaders

            public void LoadDdlSeccTeoria()
            {
                List<SeccionMateria> misSecciones = new List<SeccionMateria>();
                int idMateriaSelect = Convert.ToInt32(_vista.DdlMateria.SelectedItem.Value);
                //UnLoadAllDdlProfesor();
                //UnLoadHorario();
                //UnLoadGridView();
                _vista.GridViewModify.Visible = false;
                if (idMateriaSelect != 0)
                {
                    _vista.LabelNumHrsReq.Text = GetHrsReq(idMateriaSelect).ToString();
                
                    misSecciones = _fachada.ArmarListaDeSeccionesDisponibles(_miEscuela.IdEscuela, idMateriaSelect);
                    string seccionCod = "00";
                    for (int index = 0; index < misSecciones.Count; index++)
                    {
                        if ((misSecciones[index].ListaPractica != null) && (misSecciones[index].ListaPractica.Count > 0))
                        {
                            ListItem myListItem = new ListItem();
                            myListItem.Value = misSecciones[index].IdSeccionMateria.ToString();
                            myListItem.Text = seccionCod + misSecciones[index].Codigo;
                            _vista.DdlSeccTeoria.Items.Add(myListItem);
                        }
                    }
                    VisibleSeccTeoria();
                }
            }

            public void LoadDdlMateria()
            {
                if ((_misMaterias != null) && (_misMaterias.Count > 0))
                {
                    for (int index = 0; index < _misMaterias.Count; index++)
                    {
                        ListItem myListItem = new ListItem();
                        myListItem.Value = _misMaterias[index].Codigo.ToString();
                        myListItem.Text = _misMaterias[index].Nombre;
                        _vista.DdlMateria.Items.Add(myListItem);
                    }
                }
                else
                {
                    _vista.LabelStatus.Text = "Operacion Fallida: No existen materias con practicas registradas";
                    _vista.LabelStatus.ForeColor = System.Drawing.Color.Red;
                    _vista.LabelStatus.Visible = true;
                }
            }

            public void LoadDdlProfesor()
            {
                int idSeccTeoria = Convert.ToInt32(_vista.DdlSeccTeoria.SelectedItem.Value);
                if (idSeccTeoria == 0)
                {
                    UnLoadAllDdlProfesor();
                    UnLoadHorario();
                }
                else
                {
                    List<Profesor> misProfesores = new List<Profesor>();
                    misProfesores = _fachada.ConsultarProfesores(_miEscuela.IdEscuela);
                    for (int index = 0; index < misProfesores.Count; index++)
                    {
                        ListItem myListItem = new ListItem();
                        myListItem.Value = misProfesores[index].Crn.ToString();
                        myListItem.Text = misProfesores[index].Nombre + " " +
                                            misProfesores[index].Apellido;
                        _vista.DdlProfesor.Items.Add(myListItem);
                    }
                    VisibleProfesor();
                }
            }

            public void LoadGridView()
            {
                UnLoadGridView();
                if (!_vista.DdlSeccTeoria.SelectedItem.Value.Equals("0"))
                {
                    DataTable table = new DataTable();
                    List<Practica> misPracticasCargadas = new List<Practica>();
                    misPracticasCargadas = _fachada.ConsultarPracticasDadaSeccionMateria(Convert.ToInt32(_vista.DdlSeccTeoria.SelectedItem.Value));
                    Profesor miProfesor = new Profesor();
                    table.Columns.Add("Seccion", typeof(string));
                    table.Columns.Add("Nombre", typeof(string));
                    table.Columns.Add("Profesor", typeof(string));
                    table.Columns.Add("Id Practica", typeof(int));

                    for (int index = 0; index < misPracticasCargadas.Count; index++)
                    {
                        string numSeccion;
                    
                        miProfesor = misPracticasCargadas[index].profesor;
                        if (misPracticasCargadas[index].NumeroSeccion < 10)
                        { numSeccion = "00" + misPracticasCargadas[index].NumeroSeccion.ToString(); }
                        else
                        { numSeccion = "0" + misPracticasCargadas[index].NumeroSeccion.ToString(); }
                        table.Rows.Add(numSeccion, misPracticasCargadas[index].NombrePractica, miProfesor.Nombre + " " + miProfesor.Apellido, misPracticasCargadas[index].IdPractica);

                    }
                    _vista.GridViewModify.DataSource = table;
                    _vista.GridViewModify.DataBind();
                    _vista.GridViewModify.Visible = true;
                    HideIdPracticaColumn();
                }
            }

            public void LoadTableHorario()
            {
                if (_vista.DdlProfesor.SelectedItem.Value.Equals("0"))
                { UnLoadHorario(); }
                else
                {
                    UnLoadAllDdlIni();
                    SetHoraIniWeek();
                    VisibleHorario();
                }
            }

        #endregion endLoaders

        public Practica GetPracticaFromList(List<Practica> misPracticasCargadas, int idPractica)
        {
            bool bandera = false;
            Practica miPracticaRetorno = new Practica();
            for (int index = 0; (index < misPracticasCargadas.Count) && (!bandera); index++)
            {
                if (misPracticasCargadas[index].IdPractica == idPractica)
                {
                    miPracticaRetorno = misPracticasCargadas[index];
                    bandera = true;
                }
            }
            return miPracticaRetorno;
        }

        public void SelectItemProfesor(Practica miPracticaSelected)
        {
            bool bandera = false;
            for (int index = 0; (index < _vista.DdlProfesor.Items.Count) && (!bandera); index++)
            {
                _vista.DdlProfesor.Items[index].Selected = false;
                if (_vista.DdlProfesor.Items[index].Value.Equals(miPracticaSelected.profesor.Crn.ToString()))
                {
                    _vista.DdlProfesor.Items[index].Selected = true;
                    LoadTableHorario();
                    bandera = true;
                }
            }
        }

        #region SetModifyHoraIni

        public void ModifyHoraIniDay(DropDownList myDdl, string horaIni)
        {
            bool bandera = false;
            for (int indexDdlIni = 0; (indexDdlIni < myDdl.Items.Count) && (!bandera); indexDdlIni++)
            {
                myDdl.Items[indexDdlIni].Selected = false;
                if (myDdl.Items[indexDdlIni].Value.Equals(horaIni))
                {
                    myDdl.Items[indexDdlIni].Selected = true;
                    bandera = true;
                }
            }
        }

        public void ModifyHoraIniWeek(Practica miPracticaSelected)
        {
            for (int index = 0; index < miPracticaSelected.horarioDeClase.Count; index++)
            {
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Lunes"))
                {
                    ModifyHoraIniDay(_vista.DdlIniLun, miPracticaSelected.horarioDeClase[index].HoraInicio.Hour.ToString());
                    LoadDdlHoraFin(_vista.DdlFinLun, _vista.DdlIniLun);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Martes"))
                {
                    ModifyHoraIniDay(_vista.DdlIniMar, miPracticaSelected.horarioDeClase[index].HoraInicio.Hour.ToString());
                    LoadDdlHoraFin(_vista.DdlFinMar, _vista.DdlIniMar);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Miercoles"))
                {
                    ModifyHoraIniDay(_vista.DdlIniMie, miPracticaSelected.horarioDeClase[index].HoraInicio.Hour.ToString());
                    LoadDdlHoraFin(_vista.DdlFinMie, _vista.DdlIniMie);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Jueves"))
                {
                    ModifyHoraIniDay(_vista.DdlIniJue, miPracticaSelected.horarioDeClase[index].HoraInicio.Hour.ToString());
                    LoadDdlHoraFin(_vista.DdlFinJue, _vista.DdlIniJue);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Viernes"))
                {
                    ModifyHoraIniDay(_vista.DdlIniVie, miPracticaSelected.horarioDeClase[index].HoraInicio.Hour.ToString());
                    LoadDdlHoraFin(_vista.DdlFinVie, _vista.DdlIniVie);
                }
            }
        }

        #endregion FinSetModifyHoraIni

        #region SetModifyHoraFin

        public void ModifyHoraFinDay(DropDownList myDdl, string horaFin)
        {
            bool bandera = false;
            for (int indexDdlFin = 0; (indexDdlFin < myDdl.Items.Count) && (!bandera); indexDdlFin++)
            {
                myDdl.Items[indexDdlFin].Selected = false;
                if (myDdl.Items[indexDdlFin].Value.Equals(horaFin))
                {
                    myDdl.Items[indexDdlFin].Selected = true;
                    bandera = true;
                }
            }
        }

        public void ModifyHoraFinWeek(Practica miPracticaSelected)
        {
            for (int index = 0; index < miPracticaSelected.horarioDeClase.Count; index++)
            {
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Lunes"))
                {
                    ModifyHoraFinDay(_vista.DdlFinLun, miPracticaSelected.horarioDeClase[index].HoraFin.Hour.ToString());
                    LoadDdlSalon(_vista.DdlSalonLun, miPracticaSelected.horarioDeClase[index]);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Martes"))
                {
                    ModifyHoraFinDay(_vista.DdlFinMar, miPracticaSelected.horarioDeClase[index].HoraFin.Hour.ToString());
                    LoadDdlSalon(_vista.DdlSalonMar, miPracticaSelected.horarioDeClase[index]);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Miercoles"))
                {
                    ModifyHoraFinDay(_vista.DdlFinMie, miPracticaSelected.horarioDeClase[index].HoraFin.Hour.ToString());
                    LoadDdlSalon(_vista.DdlSalonMie, miPracticaSelected.horarioDeClase[index]);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Jueves"))
                {
                    ModifyHoraFinDay(_vista.DdlFinJue, miPracticaSelected.horarioDeClase[index].HoraFin.Hour.ToString());
                    LoadDdlSalon(_vista.DdlSalonJue, miPracticaSelected.horarioDeClase[index]);
                }
                if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Viernes"))
                {
                    ModifyHoraFinDay(_vista.DdlFinVie, miPracticaSelected.horarioDeClase[index].HoraFin.Hour.ToString());
                    LoadDdlSalon(_vista.DdlSalonVie, miPracticaSelected.horarioDeClase[index]);
                }
            }
        }


        #endregion SetModifyHorafin

        #region SetModifySalon


            public void ModifySalonDay(DropDownList myDdl, Salon miSalon)
            {
                bool bandera = false;
                for (int indexDdlSalon = 0; (indexDdlSalon < myDdl.Items.Count) && (!bandera); indexDdlSalon++)
                {
                    myDdl.Items[indexDdlSalon].Selected = false;
                    if (myDdl.Items[indexDdlSalon].Text.Equals(miSalon.Nombre))
                    {
                        myDdl.Items[indexDdlSalon].Selected = true;
                        bandera = true;
                    }
                }
                if (!bandera)
                {
                    ListItem myListItem = new ListItem();
                    //int index = myDdl.Items.Count;
                    myListItem.Value = miSalon.NumeroSalon.ToString();
                    myListItem.Text = miSalon.Nombre;
                    myListItem.Selected = true;
                    myDdl.Items.Add(myListItem);
                    //myDdl.Items[index].Selected = true;
                }
            }

            public void ModifySalonesWeek(Practica miPracticaSelected)
            {
                for (int index = 0; index < miPracticaSelected.horarioDeClase.Count; index++)
                {
                    if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Lunes"))
                    {
                        ModifySalonDay(_vista.DdlSalonLun, miPracticaSelected.horarioDeClase[index].SalonDeClase);
                        SetHrsSelect();
                    }
                    if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Martes"))
                    {
                        ModifySalonDay(_vista.DdlSalonMar, miPracticaSelected.horarioDeClase[index].SalonDeClase);
                        SetHrsSelect();
                    }
                    if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Miercoles"))
                    {
                        ModifySalonDay(_vista.DdlSalonMie, miPracticaSelected.horarioDeClase[index].SalonDeClase);
                        SetHrsSelect();
                    }
                    if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Jueves"))
                    {
                        ModifySalonDay(_vista.DdlSalonJue, miPracticaSelected.horarioDeClase[index].SalonDeClase);
                        SetHrsSelect();
                    }
                    if (miPracticaSelected.horarioDeClase[index].Dia.Equals("Viernes"))
                    {
                        ModifySalonDay(_vista.DdlSalonVie, miPracticaSelected.horarioDeClase[index].SalonDeClase);
                        SetHrsSelect();
                    }
                }
            }
            

        #endregion endSetModifySalon

        #region ModifyModule

            public void LoadModifyModule(int idPractica)
            {
                //UnLoadGridView();
                _vista.GridViewModify.Visible = false;
                LoadDdlProfesor();
                List<Practica> misPracticasCargadas = new List<Practica>();
                Practica miPracticaSelected = new Practica();
                misPracticasCargadas = _fachada.ConsultarPracticasDadaSeccionMateria(Convert.ToInt32(_vista.DdlSeccTeoria.SelectedItem.Value));

                miPracticaSelected = GetPracticaFromList(misPracticasCargadas, idPractica);

                SelectItemProfesor(miPracticaSelected);
                ModifyHoraIniWeek(miPracticaSelected);
                ModifyHoraFinWeek(miPracticaSelected);
                ModifySalonesWeek(miPracticaSelected);
            }

            protected void ResetAfterModify()
            {
                UnLoadHorario();
                UnLoadAllDdlProfesor();
                UnLoadAllDdlSeccTeoria();
                UnLoadDdlGeneric(_vista.DdlMateria);
                _vista.DdlMateria.Visible = true;
                _vista.DdlMateria.Enabled = true;
                _vista.DdlSeccTeoria.Enabled = true;
                LoadDdlMateria();
                _vista.BtnNextPractica.Visible = false;
                _vista.BtnBackPractica.Visible = false;
                _vista.BtnBackPracticaCenter.Visible = true;
            }

            public void ModificarSeccionPractica()
            {
                List<HorarioDeClase> misHorarios = new List<HorarioDeClase>();
                List<SeccionMateria> misSecciones = new List<SeccionMateria>();
                Practica miPractica = new Practica();
                Profesor miProf = new Profesor();

                int idMateria = Convert.ToInt32(_vista.DdlMateria.SelectedItem.Value);
                int idSeccTeoria = Convert.ToInt32(_vista.DdlSeccTeoria.SelectedItem.Value);
                int idPractica = Convert.ToInt32(_vista.GridViewModify.SelectedRow.Cells[4].Text);
                int numSecc = Convert.ToInt32(_vista.GridViewModify.SelectedRow.Cells[1].Text);

                miProf.Crn = Convert.ToInt32(_vista.DdlProfesor.SelectedItem.Value);
                misHorarios = SetFinalHrsSelect();
                miPractica.profesor = miProf;
                miPractica.NumeroSeccion = numSecc;
                miPractica.NombrePractica = "Practica " + _vista.DdlMateria.SelectedItem.Text;
                miPractica.horarioDeClase = misHorarios;
                miPractica.IdPractica = idPractica;

                if(_fachada.EliminarPractica(idPractica))
                {
                    if (_fachada.CrearPractica(miPractica, idSeccTeoria))
                    { _vista.LabelStatus.Text = "Operacion Exitosa"; }
                }
                else
                { _vista.LabelStatus.Text = "Operacion Fallida"; }

                ResetAfterModify();
            }

        #endregion endModifyModule
    }
}